#!/usr/bin/python
# -*- coding:UTF8 -*-

"""
定义类的基本语法
class 类名：
    代码块
类名的命名规范使用英文, 首字母大写
"""


class Persion:
    name = 'lium'
    phone = '010-6539715'


# 使用类名.类变量的方式来访问
print(Persion.name)
# 类变量的修改
Persion.name = 'Tom'
print(Persion.name)
# 实例化类
P1 = Persion()
# print(P1.name)
P1.name = 'Mr.li'
P1.phone = '010-010'
print('P1:', P1.phone, P1.name)


# 构造器
# 使用构造器可以为实例化对象的属性赋值。
class Persion:
    def __init__(self, x, y):
        """

        :param x:
        :param y:
        """
        self.name = x
        self.phone = y
        print('已经生成一个Persion的实例化对象')


P1 = Persion('张三', 25)
print(P1.name)

# 实例应用

"""
创建模拟请求类
有基本的三个属性
method 请求方法
url 请求地址
jsondata 请求数据
"""


class ApiClient:
    def __init__(self, method, url, jsondata=None):
        """

        :param method:请求方式
        :param url:请求地址
        :param jsondata:请求体
        """
        self.method = method
        self.url = url
        self.jsondata = jsondata

    def send(self):
        print(f'发送{self.method}请求,请求地址:{self.url},请求数据:{self.jsondata}')
        self.result_tree()

    def result_tree(self):
        print('响应状态码为200，响应数据为:{"success":true}')


A1 = ApiClient('get', "http://49.233.108.117:3000/api/v1/topics")
A1.send()

jsondata = {
    'accesstion': '01010101',
    'title': '0101',
    'tab': 'ask',
    'content': '010101',
}
A1 = ApiClient('get', "http://49.233.108.117:3000/api/v1/topics", jsondata=jsondata)
A1.send()


# 练习：设计出厂一个Ihone的脚本
class Iphone:
    def __init__(self, name, version, color, password):
        """

        :param name:型号
        :param version:版本
        :param color:颜色
        :param password:密码
        """
        self.name = name
        self.version = version
        self.color = color
        self.password = password

        # def push(self):
        print(f'出货一台{self.name},{self.version}版本,颜色:{self.color},激活密码为:{self.password}')

    def unlock(self, passwd):
        # 如果输入进来的密码与设置的密码一致。 解锁成功，进入系统
        if passwd == self.password:
            print('解锁成功，进入系统')
            return True  # 返回True 表示解锁成功
        else:
            print('解锁失败！')
            return False

    def call(self, num):
        print(f'电话打给{num},嘟...嘟...')


Iphone1 = Iphone('iphone4', '8g', 'green', '123456')
# Iphone1.call(1325)
# Iphone1.unlock(2666)
i = 0
while True:
    i += 1
    passwd = input('请输入密码:')
    unlock_passwd = Iphone1.unlock(passwd)
    if unlock_passwd is True:
        num = input("请输入号码:")
        Iphone1.call(num)
        break
    elif i < 3:
        print(f'请重新输入')
    else:
        print('密码已锁定后，请15分钟后尝试')
        break


# 设计执行测试用例步骤的脚本 id,title,step,except_result,level,comment
class TestCase:

    def __init__(self, id, title, step, except_result, level, comment=None):
        """
        测试类构造器
        :param id:id
        :param title:标题
        :param step:步骤
        :param except_result:期望结果
        :param level:优先级
        :param comment:备注信息
        """
        self.id = id
        self.title = title
        self.step = step
        self.except_result = except_result
        self.level = level
        self.comment = comment

    def execute(self):
        """
        执行程序
        :return:
        """
        print(f'正在执行用例:{self.id}',
              f'标题:{self.title}',
              f'步骤:{self.step}',
              f'期望结果:{self.except_result}',
              f'优先级:{self.level}',
              f'备注信息{self.comment}'
              )


t1 = TestCase(1, '用户登录', '输入正确用户名和密码', '登录成功', '高', '无')
t2 = TestCase(2, '用户登录', '输入正确用户名和错误密码', '密码错误', '高', '无')
t3 = TestCase(3, '用户登录', '输入错误用户名和正确密码', '用户名错误', '高', '无')

for t in t1, t2, t3:
    t.execute()

# 迭代升级：备注信息
import random


class TestCase:

    def __init__(self, id, title, step, except_result, level, comment=None):
        """
        测试类构造器
        :param id:id
        :param title:标题
        :param step:步骤
        :param except_result:期望结果
        :param level:优先级
        :param comment:备注信息
        """
        self.id = id
        self.title = title
        self.step = step
        self.except_result = except_result
        self.level = level
        self.comment = comment

    def execute(self):
        """
        执行程序
        :return:
        """
        print(f'正在执行用例:{self.id}',
              f'标题:{self.title}',
              f'步骤:{self.step}',
              f'期望结果:{self.except_result}',
              f'优先级:{self.level}',
              f'备注信息{self.comment}'
              )

        n = random.random()
        if n > 0.5:
            print('执行成功')
            return True
        else:
            print('执行失败')
            return False


ta = TestCase(1, '用户登录', '输入正确用户名和密码', '登录成功', '高', '无')
tb = TestCase(2, '用户登录', '输入正确用户名和错误密码', '密码错误！', '高', '无')
tc = TestCase(3, '用户登录', '输入错误用户名和正确密码', '用户名错误！', '高', '无')
td = TestCase(4, '用户登录', '', '用户名为空！', '高', '无')
te = TestCase(5, '用户登录', '输入错误用户名和正确密码', '用户名错误！', '高', '无')
tf = TestCase(6, '用户登录', '输入错误用户名和正确密码', '用户名错误！', '高', '无')
tg = TestCase(7, '用户登录', '', '用户名为空！', '高', '无')
th = TestCase(8, '用户登录', '输入错误用户名和正确密码', '用户名错误！', '高', '无')

total = 0  # 执行的次数
success = 0  # 成功的次数
failed = 0  # 失败的次数

for t in ta, tb, tc, td, te, tf, tg, th:
    total = total + 1  # 每循环1次，总数增加1.
    result = t.execute()  # 执行完成之后，返回执行结果
    if result:
        success = success + 1  # 当结果为 True 表示执行成功
    else:
        failed = failed + 1  # 失败的话 failed 加1
print(f"""测试报告""".center(30, '*'))
print(f'本次总共执行{total}个测试用例', f'成功了{success}个', f'失败了{failed}个')
